package rsj.service.usage;

import rsj.api.org.entity.CurrentTableColumn;
import rsj.api.org.entity.UsageReportParam;

import java.sql.Connection;
import java.util.List;

/**
 * 计算产品使用量
 *
 * @author yuanqinglong
 * @since 2021/3/12 13:41
 */
public interface ICalculateUsage {


    /**
     * 如果需要计算剩余量 重写此方法
     * 测试环境无法计算剩余量、生产环境可重写此方法进行计算逻辑(剩余量=购买量-使用量)
     *
     * @param statisticColumnEntities 使用量列表数据（包含购买量和使用量、未计算剩余量）
     */
    default void ifYouNeedToCalculateTheRemainingAmount(List<CurrentTableColumn> statisticColumnEntities) {

    }



    /**
     * 查询接口的使用量分组累计
     *
     * @param statisticColumnEntities 查询列表的数据 不包含使用量
     * @param connection              数据库连接
     * @param statEnv                 环境（01：测试环境，02：生产环境，03：线下测试环境）
     * @param usageReportParam        请求参数
     */
    default void queryInterfaceUsageThroughContract(List<CurrentTableColumn> statisticColumnEntities, Connection connection, String statEnv, UsageReportParam usageReportParam) {

    }


    /**
     * 填写剩余使用量字段
     *
     * @param statisticColumnEntities 产品使用情况列字段（不包含剩余量字段）需通过tableColumns进行计算
     * @param tableColumns            包含剩余量的集合
     * @param usageReportParam        请求参数
     */
    default void fillInTheRemainingUsageField(List<CurrentTableColumn> statisticColumnEntities, List<CurrentTableColumn> tableColumns, UsageReportParam usageReportParam) {

    }



    /**
     * 封装IN查询条件
     *
     * @param list IN中的元素
     * @return 组装后的IN查询条件 例：'1','2','3','4'
     */
    static String assemblyInQueryConditions(List<String> list) {
        StringBuilder values = new StringBuilder();
        for (int i = 0; i < list.size(); i++) {
            if (i > 0) {
                values.append(",");
            }
            values.append("'").append(list.get(i)).append("'");
        }
        return values.toString();
    }
}
